package com.texaco.chapasFutbol.scene;

import org.andengine.entity.scene.Scene;
import org.andengine.util.ActivityUtils;
import org.andengine.util.call.Callback;
import org.andengine.util.progress.IProgressListener;
import org.andengine.util.progress.ProgressCallable;

import com.texaco.chapasFutbol.R;
import com.texaco.chapasFutbol.entidades.Game;

/**
 * Clase que implementa el manejador de escenas.
 * @author texaco
 *
 */
public class SceneHandler {

	/**
	 * Scena que contendrá los elementos de la pantalla principal con las
	 * opciones y demás.
	 */
	private OptionScene options;
	private SplashScene splash;
	private MenuPrincipalScene menuPrincipal;
	private GameScene game;
	private SummaryScene summary;
	private WaitMultiplayerScene waitMultiplayer;
	private CreditScene credits;
	private TutorialScene tutorial;
	private Game chapasGame;
	
	public SceneHandler(Game game){
		this.chapasGame = game;
		this.options = new OptionScene(game);
		this.game = new GameScene(game);
		this.summary = new SummaryScene(game);
		this.waitMultiplayer = new WaitMultiplayerScene(game);
		this.splash = new SplashScene(game);
		this.menuPrincipal = new MenuPrincipalScene(game);
		this.credits = new CreditScene(game);
		this.tutorial = new TutorialScene(game);
		
		/*
		 * Escena por defecto sera options.
		 */
		setSplash();
	}
	
	/**
	 * Devuelve la escena actual.
	 * @return Scene escena actual.
	 */
	public Scene getScene(){
		return this.chapasGame.getActivity().getEngine().getScene();
	}

	/**
	 * Getter de la escena de opciones.
	 * @return
	 */
	public OptionScene getOptions() {
		return options;
	}

	/**
	 * Getter de la escena de juegos.
	 * @return
	 */
	public GameScene getGame() {
		return game;
	}

	/**
	 * Getter de la escena de resumen.
	 * @return
	 */
	public SummaryScene getSummary() {
		return summary;
	}

	/**
	 * Getter de la escena de espera del multiplayer.
	 * @return
	 */
	public WaitMultiplayerScene getWaitMultiplayer() {
		return waitMultiplayer;
	}

	/**
	 * Getter de la escena de splash.
	 * @return
	 */
	public SplashScene getSplash() {
		return splash;
	}
	
	/**
	 * Getter de la escena del menú principal.
	 * @return
	 */
	public MenuPrincipalScene getMenuPrincipal() {
		return menuPrincipal;
	}
	
	/**
	 * Getter de la escena de creditos.
	 * @return
	 */
	public CreditScene getCredits() {
		return credits;
	}
	
	/**
	 * Getter de la escena de tutorial.
	 * @return
	 */
	public TutorialScene getTutorial() {
		return tutorial;
	}
	
	/**
	 * Establece la escena de opciones.
	 */
	public void setOptionScene() {
		setScene(options);
	}

	/**
	 * Establece la escena del juego.
	 */
	public void setGame() {
		setScene(game);
	}
	
	/**
	 * Establece la escena de espera multiplayer.
	 */
	public void setWaitMultiplayer() {
		setScene(waitMultiplayer);
	}

	/**
	 * Establece la escena de resumen del juego.
	 */
	public void setSummary() {
		setScene(summary);
	}

	/**
	 * Establece la escena de splash.
	 */
	public void setSplash() {
		setScene(splash);
	}

	/**
	 * Establece la escena del menú principal.
	 */
	public void setMenuPrincipal() {
		setScene(menuPrincipal);
	}
	
	/**
	 * Establece la escena de los creditos.
	 */
	public void setCredits(){
		setScene(credits);
	}

	/**
	 * Establece la escena del tutorial.
	 */
	public void setTutorial(){
		setScene(tutorial);
	}

	/**
	 * Indica si la escena actual es la del juego.
	 * @return
	 */
	public boolean isGame() {
		return this.getScene().equals(game);
	}

	/**
	 * Indica si estamos en la escena de opciones.
	 * @return
	 */
	public boolean isOptions() {
		return this.getScene().equals(options);
	}

	/**
	 * Indica si estamos en la escena del menu principal
	 * @return
	 */
	public boolean isMenuPrincipal() {
		return this.getScene().equals(menuPrincipal);
	}
	
	/**
	 * Indica si estamos en la escena de resumen.
	 * @return
	 */
	public boolean isSummary() {
		return this.getScene().equals(summary);
	}

	/**
	 * Indica si estamos en la escena de espera del multiplayer.
	 * @return
	 */
	public boolean isWaitingMultiplayer() {
		return this.getScene().equals(waitMultiplayer);
	}

	/**
	 * Indica si estamos en la escena de bluetooth
	 * @return
	 */
//	public boolean isBluetooth() {
//		return this.getScene().equals(bluetooth);
//	}

	/**
	 * Obtiene la escena actual.
	 * @param scene
	 */
	private void setScene(final SceneBase scene) {
		if(!scene.isInitiated()){
			if(scene.async()){
				// La escena se cargará de forma asincrona.
				chapasGame.getActivity().runOnUiThread(new Runnable() {
					public void run() {
						ActivityUtils.doProgressAsync(chapasGame.getActivity(), 
								R.string.texto_cargando_escena, android.R.drawable.ic_menu_rotate, 
								new ProgressCallable<Void>() {
							public Void call(final IProgressListener pProgressListener) 
									throws Exception {
								scene.init(pProgressListener);
								
								pProgressListener.onProgressChanged(100);
								chapasGame.getActivity().getEngine().setScene(scene);		
								return null;
							}
						}, new Callback<Void>() {
							public void onCallback(final Void pCallbackValue) {
								/* Nothing. */
							}
						});
					}
				});
			}else{
				// Es una escena que se cargará de forma sincrona.
				scene.init(null);
				chapasGame.getActivity().getEngine().setScene(scene);
			}
		}else{
			scene.update();
			chapasGame.getActivity().getEngine().setScene(scene);		
		}
	}
}